
import type { LockInfo } from '/#/store';

import { defineStore } from 'pinia';

import { LOCK_INFO_KEY } from '/@/enums/cacheEnum';
import { Persistent } from '/@/utils/cache/persistent';
import { useUserStore } from './user';

interface LockState {
    lockInfo: Nullable<LockInfo>;
}

export const useLockStore = defineStore({
    id: 'app-lock',
    state: (): LockState => ({
        lockInfo: Persistent.getLocal(LOCK_INFO_KEY),
    }),
    getters: {
        getLockInfo(): Nullable<LockInfo> {
            return this.lockInfo;
        },
    },
    actions: {
        setLockInfo(info: LockInfo) {
            this.lockInfo = Object.assign({}, this.lockInfo, info);
            Persistent.setLocal(LOCK_INFO_KEY, this.lockInfo, true);
        },
        resetLockInfo() {
            Persistent.removeLocal(LOCK_INFO_KEY, true);
            this.lockInfo = null;
        },
        // Unlock
        async unLock(password?: string) {
            const userStore = useUserStore();
            if (this.lockInfo?.pwd === password) {
                this.resetLockInfo();
                return true;
            }
            const tryLogin = async () => {
                try {
                    const user_name = userStore.getUserInfo?.user_name;
                    const res = await userStore.login({
                        user_name,
                        password: password!,
                        goHome: false,
                        mode: 'none',
                    });
                    if (res) {
                        this.resetLockInfo();
                    }
                    return res;
                } catch (error) {
                    return false;
                }
            };
            return await tryLogin();
        },
    },
});
